﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsEnfoqueMercadoTerreno_CRN:clsEnfoqueBase,IControlEstados
    {
        
        public decimal PrecioM2
        {
            get
            {
                if (this.SuperficieDeTerreno > 0)
                    return Convert.ToDecimal(this.PrecioDeVenta / this.SuperficieDeTerreno);
                return 0;
            }
        }
        public double Redondeo { get; set; }
        public double PrecioDeVenta { get; set; }
        public double ValorHomologadoM2 
        { 
            get 
            {
                return this.FactorDeReferencia * Convert.ToDouble(this.PrecioM2);
            } 
        }

        public clsEnfoqueMercadoTerreno_CRN(clsEnfoqueDeMercado_CRN objEnfoqueDeMercado)
            : base(objEnfoqueDeMercado)
        {
            this.Redondeo = 2;
            this.PrecioDeVenta = 0;
        }

        #region Métodos

        public bool Guardar()
        {
            if (DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaNuevoEnfoqueMercadoTerreno();
                else
                {
                    if (this.EsModificado)
                        return ModificaEnfoque();
                    else
                        return EliminaEnfoque();
                }
            }
            return false;
        }

        private bool CreaNuevoEnfoqueMercadoTerreno()
        {
            clsEnfoqueMercadoTerreno_CD objEnfoqueMTerreno_CD = new clsEnfoqueMercadoTerreno_CD();
            return objEnfoqueMTerreno_CD.NuevoEnfoqueMercadoTerreno(this);
        }

        private bool ModificaEnfoque()
        {
            clsEnfoqueMercadoTerreno_CD objEnfoqueMTerreno_CD = new clsEnfoqueMercadoTerreno_CD();
            return objEnfoqueMTerreno_CD.ActualizaEnfoqueMercadoTerreno(this);
        }

        private bool EliminaEnfoque()
        {
            clsEnfoqueMercadoTerreno_CD objEnfoqueMTerreno_CD = new clsEnfoqueMercadoTerreno_CD();
            return objEnfoqueMTerreno_CD.EliminaEnfoqueMercadoTerreno(this);
        }

        public bool DatosValidos()
        {
            if ((this.FactorOtro != 1) && (this.Justificacion.Length == 0))
            {
                MessageBox.Show("Debe de escribir la Justificación de porqué el Factor Otro es diferente a 0\nLos datos se guardarán hasta que corrija sus datos","Ingresar Justificación de "+this.Etiqueta, MessageBoxButtons.OK,MessageBoxIcon.Information);
                return false;
            }
            return true;
        }

        public static BindingList<clsEnfoqueMercadoTerreno_CRN> RecuperaEnfoques(clsEnfoqueDeMercado_CRN objEnfoqueDeMercado)
        {
            BindingList<clsEnfoqueMercadoTerreno_CRN> blEnfoques = new BindingList<clsEnfoqueMercadoTerreno_CRN>();
            clsEnfoqueMercadoTerreno_CD objEnfoqueMTerreno_CD = new clsEnfoqueMercadoTerreno_CD();
            BindingList<dsEnfoqueDeMercado.EnfoqueMercadoTerrenoRow> blEnfoquesRecuperados = objEnfoqueMTerreno_CD.RecuperaEfoquesDeMTerreno(objEnfoqueDeMercado.Inmueble.Avaluo.IdAvaluo);
            foreach (dsEnfoqueDeMercado.EnfoqueMercadoTerrenoRow filaEnfoque in blEnfoquesRecuperados)
            {
                clsEnfoqueMercadoTerreno_CRN objEnfoqueTerreno = new clsEnfoqueMercadoTerreno_CRN(objEnfoqueDeMercado);
                objEnfoqueTerreno.CalidadDeZona = filaEnfoque.CalidadZona;
                objEnfoqueTerreno.Calle = filaEnfoque.Calle;
                objEnfoqueTerreno.Colonia = filaEnfoque.Colonia;
                objEnfoqueTerreno.CP = filaEnfoque.CP;
                objEnfoqueTerreno.EsModificado = true;
                objEnfoqueTerreno.FactorComercializacion = filaEnfoque.FactorComercializacion;
                objEnfoqueTerreno.FactorOtro = filaEnfoque.FactorOtro;
                objEnfoqueTerreno.FactorUbicacion = filaEnfoque.FactorUbicacion;
                objEnfoqueTerreno.FactorZona = filaEnfoque.FactorZona;
                objEnfoqueTerreno.FechaDeInvestigacion = filaEnfoque.FechaInvest;
                objEnfoqueTerreno.Fuente = filaEnfoque.Fuente;
                objEnfoqueTerreno.IDEnfoque = filaEnfoque.IDEnfoque;
                objEnfoqueTerreno.Informes = filaEnfoque.Informes;
                objEnfoqueTerreno.Justificacion = filaEnfoque.JustificaFOt;
                objEnfoqueTerreno.PrecioDeVenta = filaEnfoque.PrecioVenta;
                objEnfoqueTerreno.Etiqueta = filaEnfoque.Etiqueta;
                objEnfoqueTerreno.SuperficieDeTerreno = filaEnfoque.SupTerreno;
                objEnfoqueTerreno.Telefono = filaEnfoque.Telefono;
                objEnfoqueTerreno.TipoInmueble = filaEnfoque.TipoInmueble;
                objEnfoqueTerreno.UsoSuelo = filaEnfoque.UsoSuelo;
                blEnfoques.Add(objEnfoqueTerreno);
            }
            return blEnfoques;
        }

        public override double ObtieneFactorDeReferencia()
        {
            double resultado = FactorComercializacion * FactorOtro * FactorUbicacion * FactorZona;
            if (FactorSuperficie != 0)
                resultado = resultado * FactorSuperficie;
            return resultado;
        }

        public override double ObtieneFactorSuperficie()
        {
            if (clsAvaluo_CRN.AvaluoActual.Inmueble.Terreno.Construccion.SuperficieDeTerreno > 0)
            {
                double resultado = this.SuperficieDeTerreno / Convert.ToDouble(clsAvaluo_CRN.AvaluoActual.Inmueble.Terreno.Construccion.SuperficieDeTerreno);
                return  Math.Pow(resultado,(1.0 / 6.0));
            }
            return 0;
        }

        public override void Pegar(object objEnfoque)
        {
            if ((objEnfoque is clsEnfoqueMercadoTerreno_CRN) && (objEnfoque != null))
            {
                base.Pegar(objEnfoque);
                clsEnfoqueMercadoTerreno_CRN objEnfoqueTerreno = (clsEnfoqueMercadoTerreno_CRN)(objEnfoque);
                this.PrecioDeVenta = objEnfoqueTerreno.PrecioDeVenta;
            }
            else
            {
                MessageBox.Show("Aun no ha copiado ningún comparativo de Terreno", "Error al copiar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion
    }
}
